package com.example.springcloud.order.service.tcc;

import com.example.springcloud.order.dto.OrderDTO;
import com.example.springcloud.order.entity.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * 订单 TCC 服务接口
 * TCC 模式：Try-Confirm-Cancel
 * 优点：性能高，业务逻辑清晰
 * 缺点：需要实现 Try、Confirm、Cancel 三个方法，开发成本高
 */
@LocalTCC
public interface OrderTCCService {

    /**
     * Try 阶段：尝试执行业务，预留资源
     *
     * @param orderDTO 订单信息
     * @return 订单（包含订单ID，会保存到 context 中供 Confirm 和 Cancel 使用）
     */
    @TwoPhaseBusinessAction(
        name = "createOrderTCC",
        commitMethod = "confirm",
        rollbackMethod = "cancel"
    )
    Order tryCreate(@BusinessActionContextParameter(paramName = "orderDTO") OrderDTO orderDTO);

    /**
     * Confirm 阶段：确认提交，使用预留的资源
     *
     * @param context 上下文
     * @return 是否成功
     */
    boolean confirm(BusinessActionContext context);

    /**
     * Cancel 阶段：取消执行，释放预留的资源
     *
     * @param context 上下文
     * @return 是否成功
     */
    boolean cancel(BusinessActionContext context);
}

